home *** CD-ROM | disk | FTP | other *** search
/ Gamers Delight 2 / Gamers Delight 2.iso / Aminet / game / role / AMScen_0_9.lha / AMScen / verbs.m < prev   
Text File  |  1995-01-21  |  62KB  |  2,554 lines

  1. /*
  2.  * Amiga MUD
  3.  *
  4.  * Copyright (c) 1995 by Chris Gray
  5.  */
  6.  
  7. /*
  8.  * verbs.m - define the standard verbs (commands).
  9.  *    This normally follows after 'base.m' and 'util.m'.
  10.  */
  11.  
  12. private tp_verbs CreateTable().
  13. use tp_verbs
  14.  
  15. /* All of the separator words that we will use */
  16.  
  17. ignore Word(G, "to").
  18. ignore Word(G, "at").
  19. ignore Word(G, "around").
  20. ignore Word(G, "from").
  21. ignore Word(G, "on").
  22. ignore Word(G, "onto").
  23. ignore Word(G, "do").
  24.  
  25. /* Also used, but are defined as verbs.
  26.  
  27.     "up", "down", "in", "into", "inside", "with"
  28.  
  29. */
  30.  
  31. /* routines for going in specific directions (these are actual verbs) */
  32.  
  33. define tp_verbs proc v_north()bool:
  34.     UserMove(D_NORTH)
  35. corp;
  36. define tp_verbs proc v_south()bool:
  37.     UserMove(D_SOUTH)
  38. corp;
  39. define tp_verbs proc v_east()bool:
  40.     UserMove(D_EAST)
  41. corp;
  42. define tp_verbs proc v_west()bool:
  43.     UserMove(D_WEST)
  44. corp;
  45. define tp_verbs proc v_northEast()bool:
  46.     UserMove(D_NORTHEAST)
  47. corp;
  48. define tp_verbs proc v_northWest()bool:
  49.     UserMove(D_NORTHWEST)
  50. corp;
  51. define tp_verbs proc v_southEast()bool:
  52.     UserMove(D_SOUTHEAST)
  53. corp;
  54. define tp_verbs proc v_southWest()bool:
  55.     UserMove(D_SOUTHWEST)
  56. corp;
  57. define tp_verbs proc v_up()bool:
  58.     UserMove(D_UP)
  59. corp;
  60. define tp_verbs proc v_down()bool:
  61.     UserMove(D_DOWN)
  62. corp;
  63. define tp_verbs proc v_enter()bool:
  64.     UserMove(D_ENTER)
  65. corp;
  66. define tp_verbs proc v_exit()bool:
  67.     UserMove(D_EXIT)
  68. corp;
  69.  
  70. /* define the actual movement verbs */
  71.  
  72. Verb0(G, "north", 0, v_north).
  73. Verb0(G, "south", 0, v_south).
  74. Verb0(G, "east", 0, v_east).
  75. Verb0(G, "west", 0, v_west).
  76. Verb0(G, "northeast", 0, v_northEast).
  77. Verb0(G, "northwest", 0, v_northWest).
  78. Verb0(G, "southeast", 0, v_southEast).
  79. Verb0(G, "southwest", 0, v_southWest).
  80. Verb0(G, "up", 0, v_up).
  81. Verb0(G, "down", 0, v_down).
  82. Verb0(G, "enter", 0, v_enter).
  83. Verb0(G, "exit", 0, v_exit).
  84.  
  85. Synonym(G, "north", "n").
  86. Synonym(G, "south", "s").
  87. Synonym(G, "east", "e").
  88. Synonym(G, "west", "w").
  89. Synonym(G, "northeast", "ne").
  90. Synonym(G, "northeast", "north-east").
  91. Synonym(G, "northwest", "nw").
  92. Synonym(G, "northwest", "north-west").
  93. Synonym(G, "southeast", "se").
  94. Synonym(G, "southeast", "south-east").
  95. Synonym(G, "southwest", "sw").
  96. Synonym(G, "southwest", "south-west").
  97. Synonym(G, "up", "u").
  98. Synonym(G, "down", "d").
  99. Synonym(G, "enter", "in").
  100. Synonym(G, "enter", "into").
  101. Synonym(G, "enter", "inside").
  102. Synonym(G, "exit", "out").
  103. Synonym(G, "exit", "outside").
  104. Synonym(G, "exit", "leave").
  105.  
  106. define tp_verbs proc v_go(string where)bool:
  107.  
  108.     if where = "" then
  109.     Print("You must specify a direction to " + Verb() + ".\n");
  110.     false
  111.     elif DirMatch(where) ~= -1 then
  112.     Parse(G, where) ~= 0
  113.     else
  114.     Print("I don't know how to " + Verb() + " " + where + ".\n");
  115.     false
  116.     fi
  117. corp;
  118.  
  119. Verb1(G, "go", FindAnyWord(G, "to"), v_go).
  120. Synonym(G, "go", "walk").
  121. Synonym(G, "go", "climb").
  122. Synonym(G, "go", "jump").
  123. Synonym(G, "go", "move").
  124. Synonym(G, "go", "head").
  125. Synonym(G, "go", "run").
  126. Synonym(G, "go", "crawl").
  127. Synonym(G, "go", "trot").    /* canter, gallop, slither, ...? - nah! */
  128.  
  129. /* This verb is defined early, so we can use "with" for other verbs. */
  130.  
  131. define tp_verbs proc v_with()bool:
  132.     string what, whatName;
  133.     status st;
  134.     thing object;
  135.     grammar g;
  136.  
  137.     what := GetNounPhrase(G, GetTail(), FindAnyWord(G, "do"));
  138.     if what = "" then
  139.     Print("You must specify what you want to do something with.\n");
  140.     false
  141.     else
  142.     if GetWord() ~= "do" then
  143.         Print("Use the form: with <object> do <command>\n");
  144.         false
  145.     else
  146.         whatName := FormatName(what);
  147.         st := FindName(Me()@p_pCarrying, p_oName, what);
  148.         if st = succeed then
  149.         object := FindResult();
  150.         g := object@p_oSpecialGrammar;
  151.         if g = nil then
  152.             Print("The " + whatName + " has no special actions.\n");
  153.             false
  154.         else
  155.             what := GetTail();
  156.             if what = "" then
  157.             Print("You must specify what you want to do with the "+
  158.                 whatName + ".\n");
  159.             false
  160.             else
  161.             Parse(g, GetTail()) ~= 0
  162.             fi
  163.         fi
  164.         elif st = continue then
  165.         Print(whatName + " is ambiguous.\n");
  166.         false
  167.         else
  168.         Print("You are not carrying any " + whatName + ".\n");
  169.         false
  170.         fi
  171.     fi
  172.     fi
  173. corp;
  174.  
  175. VerbTail(G, "with", v_with).
  176.  
  177. /* create a little toy to test 'with' */
  178.  
  179. /*
  180. define tp_verbs o_toy CreateThing(nil).
  181. SetupObject(o_toy, r_arrivals, "toy;with",
  182.     "The toy is here for testing the 'with' command only.").
  183. o_toy@p_oSpecialGrammar := CreateGrammar().
  184. define tp_verbs proc tv_hello()bool:
  185.     Print("The toy says hello back.\n");
  186.     true
  187. corp;
  188. define tp_verbs proc tv_hi()bool:
  189.     Print("The toy says hi back.\n");
  190.     true
  191. corp;
  192. define tp_verbs proc tv_echo()bool:
  193.     Print("Toy: " + GetTail() + "\n");
  194.     true
  195. corp;
  196. Verb0(o_toy@p_oSpecialGrammar, "hello", 0, tv_hello).
  197. Verb0(o_toy@p_oSpecialGrammar, "hi", 0, tv_hi).
  198. VerbTail(o_toy@p_oSpecialGrammar, "echo", tv_echo).
  199. */
  200.  
  201. /*
  202.  * now some silly ones for people to play with
  203.  */
  204.  
  205. define tp_verbs proc doPosition(string what; int pos)bool:
  206.     thing me, here, it;
  207.     status st;
  208.     string s1, s2, whatName;
  209.     property int countProp;
  210.     int n;
  211.     action a;
  212.  
  213.     me := Me();
  214.     here := Here();
  215.     case pos
  216.     incase POS_SIT_IN:
  217.     s1 := "sit";
  218.     s2 := "in";
  219.     countProp := p_oCanSitIn;
  220.     incase POS_SIT_ON:
  221.     s1 := "sit";
  222.     s2 := "on";
  223.     countProp := p_oCanSitOn;
  224.     incase POS_LIE_IN:
  225.     s1 := "lie";
  226.     s2 := "in";
  227.     countProp := p_oCanLieIn;
  228.     incase POS_LIE_ON:
  229.     s1 := "lie";
  230.     s2 := "on";
  231.     countProp := p_oCanLieOn;
  232.     incase POS_STAND_IN:
  233.     s1 := "stand";
  234.     s2 := "in";
  235.     countProp := p_oCanStandIn;
  236.     incase POS_STAND_ON:
  237.     s1 := "stand";
  238.     s2 := "on";
  239.     countProp := p_oCanStandOn;
  240.     esac;
  241.     if me@p_pPosition ~= POS_NONE then
  242.     Print("You are still ");
  243.     ShowPosition(me);
  244.     false
  245.     elif what = "" or what == "down" then
  246.     Print("You must say what you want to " + s1 + " " + s2 + ".\n");
  247.     false
  248.     else
  249.     whatName := FormatName(what);
  250.     st := FindName(here@p_rContents, p_oName, what);
  251.     if st = succeed then
  252.         whatName := " the " + whatName;
  253.         it := FindResult();
  254.         n := it@countProp;
  255.         if n = 0 then
  256.         Print("You can't " + s1 + " " + s2 + whatName + ".\n");
  257.         false
  258.         elif n = 1 then
  259.         Print("There is no room " + s2 + whatName + ".\n");
  260.         false
  261.         else
  262.         st := continue;
  263.         SetIt(it);
  264.         a := it@p_oPositionChecker;
  265.         if a ~= nil then
  266.             st := call(a, status)(pos);
  267.         fi;
  268.         if st ~= fail then
  269.             if st = continue then
  270.             Print("You " + s1 + " " + s2 + whatName + ".\n");
  271.             if not me@p_pHidden and CanSee(here, me) then
  272.                 OPrint(FormatName(me@p_pName) + " " + s1 + "s " +
  273.                 s2 + whatName + ".\n");
  274.             fi;
  275.             fi;
  276.             me@p_pPosition := pos;
  277.             me@p_pWhere := it;
  278.             it@countProp := n - 1;
  279.             true
  280.         else
  281.             false
  282.         fi
  283.         fi
  284.     elif st = continue then
  285.         Print(whatName + " is ambiguous here.\n");
  286.         false
  287.     else
  288.         if MatchName(here@p_rScenery, what) ~= -1 then
  289.         Print("You can't " + s1 + " " + s2 + " the " + whatName+".\n");
  290.         else
  291.         Print(IsAre("There", "no", whatName, "here.\n"));
  292.         fi;
  293.         false
  294.     fi
  295.     fi
  296. corp;
  297.  
  298. define tp_misc proc PositionProp(int posCode)property int:
  299.  
  300.     case posCode
  301.     incase POS_SIT_IN:
  302.     p_oCanSitIn
  303.     incase POS_SIT_ON:
  304.     p_oCanSitOn
  305.     incase POS_LIE_IN:
  306.     p_oCanLieIn
  307.     incase POS_LIE_ON:
  308.     p_oCanLieOn
  309.     incase POS_STAND_IN:
  310.     p_oCanStandIn
  311.     incase POS_STAND_ON:
  312.     p_oCanStandOn
  313.     default:
  314.     Print("*** Invalid code to PositionProp ***\n");
  315.     p_oCanSitIn
  316.     esac
  317. corp;
  318.  
  319. define tp_verbs proc v_standUp()bool:
  320.     int pos;
  321.     thing me, it;
  322.     property int prop;
  323.  
  324.     me := Me();
  325.     pos := me@p_pPosition;
  326.     if pos = POS_NONE then
  327.     Print("You are already standing up.\n");
  328.     false
  329.     else
  330.     Print("You stand up.\n");
  331.     if not me@p_pHidden and CanSee(Here(), me) then
  332.         OPrint(FormatName(me@p_pName) + " stands up.\n");
  333.     fi;
  334.     me@p_pPosition := POS_NONE;
  335.     it := me@p_pWhere;
  336.     me@p_pWhere := me;    /* free any reference! */
  337.     prop := PositionProp(pos);
  338.     it@(prop) := it@(prop) + 1;
  339.     true
  340.     fi
  341. corp;
  342.  
  343. define tp_verbs proc v_sitLieStand()bool:
  344.     string v, w, np;
  345.  
  346.     v := Verb();
  347.     w := GetWord();
  348.     if w == "down" then
  349.     w := GetWord();
  350.     fi;
  351.     np := GetTail();
  352.     if v == "stand" and w == "up" then
  353.     v_standUp()
  354.     elif np = "" then
  355.     if w = "" then
  356.         w := "on";
  357.     fi;
  358.     Print("You must say what you want to " + v + " " + w + ".\n");
  359.     false
  360.     else
  361.     np := GetNounPhrase(G, GetTail(), 0);
  362.     if w == "in" then
  363.         if v == "sit" then
  364.         doPosition(np, POS_SIT_IN)
  365.         elif v == "stand" then
  366.         doPosition(np, POS_STAND_IN)
  367.         else
  368.         doPosition(np, POS_LIE_IN)
  369.         fi
  370.     elif w == "on" then
  371.         if v == "sit" then
  372.         doPosition(np, POS_SIT_ON)
  373.         elif v == "stand" then
  374.         doPosition(np, POS_STAND_ON)
  375.         else
  376.         doPosition(np, POS_LIE_ON)
  377.         fi
  378.     else
  379.         Print("I don't know how to " + v + " " + w + " something.\n");
  380.         false
  381.     fi
  382.     fi
  383. corp;
  384.  
  385. VerbTail(G, "sit", v_sitLieStand).
  386. VerbTail(G, "lie", v_sitLieStand).
  387. VerbTail(G, "lay", v_sitLieStand).
  388. VerbTail(G, "stand", v_sitLieStand).
  389. Verb0(G, "standup", 0, v_standUp).
  390.  
  391. /* some standard verb routines and the corresponding verbs */
  392.  
  393. /*
  394.  * lookAtObject - common code to do the looking at a normal object.
  395.  */
  396.  
  397. define tp_verbs proc lookAtObject(thing object)bool:
  398.     status st;
  399.     action a;
  400.     string s;
  401.  
  402.     st := continue;
  403.     a := object@p_oDescCheck;
  404.     if a ~= nil then
  405.     st := call(a, status)();
  406.     fi;
  407.     if st ~= fail then
  408.     a := object@p_oDescAction;
  409.     if a = nil then
  410.         s := object@p_oDesc;
  411.         if s = "" then
  412.         Print("You see nothing special about the " +
  413.             FormatName(object@p_oName) + ".\n");
  414.         else
  415.         NPrint(s);
  416.         fi;
  417.     else
  418.         SetIt(object);
  419.         Print(call(a, string)() + "\n");
  420.     fi;
  421.     true
  422.     else
  423.     false
  424.     fi
  425. corp;
  426.  
  427. define tp_verbs proc v_look(string what)bool:
  428.     thing here, me, object;
  429.     string ambig, name, s;
  430.     action a;
  431.     status st;
  432.     int dir;
  433.     bool wasScenery;
  434.  
  435.     here := Here();
  436.     me := Me();
  437.     if what = "" then
  438.     Print("You must specify what you want to look at.\n");
  439.     false
  440.     elif not CanSee(here, me) then
  441.     Print("It is dark here.\n");
  442.     false
  443.     elif what == "all" then
  444.     st := DoAll(here@p_rContents, lookAtObject);
  445.     if st = fail then
  446.         Print("There are no obvious things here to look at.\n");
  447.         false
  448.     else
  449.         st = continue
  450.     fi
  451.     else
  452.     object := FindAgent(what);
  453.     if object ~= nil then
  454.         /* player is examining another player or a monster */
  455.         LookAtCharacter(object)
  456.     else
  457.         dir := DirMatch(what);
  458.         if dir ~= -1 then
  459.         /* looking in a given direction */
  460.         s := here@(DirDesc(dir));
  461.         if s = "" then
  462.             Print("You see nothing special in that direction.\n");
  463.         else
  464.             NPrint(s);
  465.         fi;
  466.         true
  467.         else
  468.         /* player is examining an object */
  469.         name := FormatName(what);
  470.         object := nil;
  471.         wasScenery := false;
  472.         ambig := " is ambiguous here.\n";
  473.         st := FindName(me@p_pCarrying, p_oName, what);
  474.         if st = fail then
  475.             st := FindName(here@p_rContents, p_oName, what);
  476.             if st = fail and here@p_rBuyList ~= nil then
  477.             st := FindName(here@p_rBuyList, p_oName, what);
  478.             fi;
  479.             if st = fail then
  480.             if MatchName(here@p_rScenery, what) ~= -1 then
  481.                 Print("You see nothing special about the " +
  482.                 name + ".\n");
  483.                 wasScenery := true;
  484.             else
  485.                 Print(IsAre("There", "no", name, "here.\n"));
  486.             fi;
  487.             elif st = continue then
  488.             Print(name);
  489.             Print(ambig);
  490.             else
  491.             object := FindResult();
  492.             fi;
  493.         elif st = continue then
  494.             Print(name);
  495.             Print(ambig);
  496.         else
  497.             object := FindResult();
  498.         fi;
  499.         if object = nil then
  500.             wasScenery
  501.         else
  502.             lookAtObject(object)
  503.         fi
  504.         fi
  505.     fi
  506.     fi
  507. corp;
  508.  
  509. /*
  510.  * Note that the code here is very similar to that in EnterRoom in util.m
  511.  * This is as desired - the same stuff should be seen.
  512.  */
  513.  
  514. define tp_verbs proc v_lookAround()bool:
  515.     thing me;
  516.  
  517.     me := Me();
  518.     if not CanSee(Here(), me) then
  519.     Print("It is dark here.\n");
  520.     false
  521.     else
  522.     if ShowRoomToMe(true) then
  523.         if not me@p_pHidden then
  524.         OPrint(FormatName(me@p_pName) + " looks around.\n");
  525.         fi;
  526.         true
  527.     else
  528.         false
  529.     fi
  530.     fi
  531. corp;
  532.  
  533. define tp_verbs proc v_exits()bool:
  534.     ShowExits(Here());
  535.     true
  536. corp;
  537.  
  538. Verb1(G, "look", FindAnyWord(G, "at"), v_look).
  539. Verb0(G, "look", FindAnyWord(G, "around"), v_lookAround).
  540. Synonym(G, "look", "examine").
  541. Synonym(G, "look", "l").
  542. Verb0(G, "exits", 0, v_exits).
  543. Synonym(G, "exits", "x").
  544.  
  545. define tp_verbs proc readObject(thing object)bool:
  546.     action a;
  547.  
  548.     a := object@p_oReadAction;
  549.     if a ~= nil then
  550.     Paginate(call(a, string)() + "\n");
  551.     true
  552.     elif object@p_oReadString ~= "" then
  553.     Paginate(object@p_oReadString + "\n");
  554.     true
  555.     else
  556.     Print("There is nothing to read on the " +
  557.         FormatName(object@p_oName) + ".\n");
  558.     false
  559.     fi
  560. corp;
  561.  
  562. define tp_verbs proc doReadObject(thing object)bool:
  563.  
  564.     ignore readObject(object);
  565.     true
  566. corp;
  567.  
  568. define tp_verbs proc v_read(string what)bool:
  569.     thing me, here, object;
  570.     status st;
  571.     action a;
  572.     string name, ambig;
  573.     bool wasScenery;
  574.  
  575.     me := Me();
  576.     here := Here();
  577.     if what = "" then
  578.     Print("You must specify what you want to read.\n");
  579.     false
  580.     elif not CanSee(here, me) then
  581.     Print("It is dark here.\n");
  582.     false
  583.     else
  584.     st := continue;
  585.     a := me@p_pReadChecker;
  586.     if a ~= nil then
  587.         st := call(a, status)();
  588.     fi;
  589.     if st = continue then
  590.         if what == "all" then
  591.         st := DoAll(me@p_pCarrying, readObject);
  592.         if st ~= fail then
  593.             st := DoAll(here@p_rContents, doReadObject);
  594.             if st = fail then
  595.             st := continue;
  596.             fi;
  597.         fi;
  598.         if st = fail then
  599.             Print("There are no obvious things here to get.\n");
  600.             false
  601.         else
  602.             st = continue
  603.         fi
  604.         else
  605.         name := FormatName(what);
  606.         object := FindAgent(what);
  607.         if object ~= nil then
  608.             readObject(object)
  609.         else
  610.             object := nil;
  611.             wasScenery := false;
  612.             ambig := " is ambiguous here.\n";
  613.             st := FindName(me@p_pCarrying, p_oName, what);
  614.             if st = fail then
  615.             st := FindName(here@p_rContents, p_oName, what);
  616.             if st = fail then
  617.                 if MatchName(here@p_rScenery, what) ~= -1 then
  618.                 Print("There is nothing to read on the " +
  619.                     name + ".\n");
  620.                 wasScenery := true;
  621.                 else
  622.                 Print(IsAre("There", "no", name, "here.\n"));
  623.                 fi;
  624.             elif st = continue then
  625.                 Print(name);
  626.                 Print(ambig);
  627.             else
  628.                 object := FindResult();
  629.             fi;
  630.             elif st = continue then
  631.             Print(name);
  632.             Print(ambig);
  633.             else
  634.             object := FindResult();
  635.             fi;
  636.             if object = nil then
  637.             wasScenery
  638.             else
  639.             readObject(object)
  640.             fi
  641.         fi
  642.         fi
  643.     else
  644.         st ~= fail
  645.     fi
  646.     fi
  647. corp;
  648. Verb1(G, "read", 0, v_read).
  649.  
  650. define tp_verbs proc v_inventory()bool:
  651.     int cash;
  652.     thing me;
  653.  
  654.     me := Me();
  655.     cash := me@p_pMoney;
  656.     if cash = 0 then
  657.     Print("You are broke.\n");
  658.     else
  659.     Print("You have ");
  660.     IPrint(cash);
  661.     if cash = 1 then
  662.         Print(" bluto.\n");
  663.     else
  664.         Print(" blutos.\n");
  665.     fi;
  666.     fi;
  667.     if ShowList(me@p_pCarrying, "You are carrying:\n") then
  668.     Print("You are not carrying anything.\n");
  669.     fi;
  670.     if not me@p_pHidden and CanSee(Here(), me) then
  671.     OPrint(FormatName(me@p_pName) + " takes inventory.\n");
  672.     fi;
  673.     true
  674. corp;
  675.  
  676. Verb0(G, "inventory", 0, v_inventory).
  677. Synonym(G, "inventory", "inv").
  678. Synonym(G, "inventory", "i").
  679.  
  680. define t_base p_oNotGetString CreateStringProp().
  681.  
  682. define t_util proc public DoGet(thing where, who, what)status:
  683.     action a;
  684.     string whatName;
  685.     status st;
  686.  
  687.     whatName := FormatName(what@p_oName);
  688.     if what@p_oNotGettable then
  689.     if what@p_oNotGetString ~= "" then
  690.         Print(what@p_oNotGetString + "\n");
  691.     else
  692.         Print("You cannot get the " + whatName + ".\n");
  693.     fi;
  694.     fail
  695.     else
  696.     a := what@p_oGetChecker;
  697.     st := continue;
  698.     if a ~= nil then
  699.         SetIt(what);
  700.         st := call(a, status)(what);
  701.     fi;
  702.     if st = continue then
  703.         /* object not chained to floor or anything */
  704.         st := DoRoomGetChecks(where, what);
  705.         if st = continue then
  706.         /* room floor isn't a pool of glue or anything */
  707.         if CarryItem(what) then
  708.             DelElement(where@p_rContents, what);
  709.             what -- p_oWhere;
  710.             SPrint(who, whatName + ": taken.\n");
  711.             if CanSee(where, who) then
  712.             if who@p_pHidden then
  713.                 ABPrint(where, who, who, "The " + whatName +
  714.                     " rises and vanishes from view\n");
  715.             else
  716.                 ABPrint(where, who, who, FormatName(who@p_pName) +
  717.                 " has taken the " + whatName + ".\n");
  718.             fi;
  719.             fi;
  720.             succeed
  721.         else
  722.             fail
  723.         fi
  724.         else
  725.         st
  726.         fi
  727.     else
  728.         st
  729.     fi
  730.     fi
  731. corp;
  732.  
  733. define tp_verbs proc getAllStub(thing object)bool:
  734.  
  735.     DoGet(Here(), Me(), object) ~= fail
  736. corp;
  737.  
  738. define tp_verbs proc v_get(string what)bool:
  739.     string verb, whatName;
  740.     thing me, here, object;
  741.     status st;
  742.  
  743.     verb := Verb();
  744.     here := Here();
  745.     me := Me();
  746.     if what = "" then
  747.     Print("You must specify what you want to " + Verb() + ".\n");
  748.     false
  749.     elif what == "inventory" and verb == "take" then
  750.     v_inventory()
  751.     elif what == "exit" and verb == "take" then
  752.     v_exit()
  753.     elif what == "entrance" and verb == "take" then
  754.     v_enter()
  755.     elif what == "up" and verb == "get" then
  756.     v_standUp()
  757.     elif what == "all" then
  758.     st := DoAll(here@p_rContents, getAllStub);
  759.     if st = fail then
  760.         Print("There are no obvious things here to get.\n");
  761.         false
  762.     else
  763.         st = continue
  764.     fi
  765.     else
  766.     whatName := FormatName(what);
  767.     st := FindName(here@p_rContents, p_oName, what);
  768.     if st = succeed then
  769.         object := FindResult();
  770.         DoGet(here, me, object) ~= fail
  771.     elif st = continue then
  772.         Print(whatName + " is ambiguous here.\n");
  773.         false
  774.     else
  775.         if FindAgent(what) ~= nil then
  776.         Print("You can't get " + whatName + ".\n");
  777.         else
  778.         if FindName(me@p_pCarrying, p_oName, what) ~= fail then
  779.             Print("You are already carrying the " + whatName + ".\n");
  780.         else
  781.             if MatchName(here@p_rScenery, what) ~= -1 then
  782.             Print("You can't get the " + whatName + ".\n");
  783.             else
  784.             Print(IsAre("There", "no", whatName, "here.\n"));
  785.             fi;
  786.         fi;
  787.         fi;
  788.         false
  789.     fi
  790.     fi
  791. corp;
  792.  
  793. Verb1(G, "pick", FindAnyWord(G, "up"), v_get).
  794. Verb1(G, "get", 0, v_get).
  795. Synonym(G, "get", "pickup").
  796. Synonym(G, "get", "take").
  797.  
  798. /* this is public since it is used in the build code */
  799.  
  800. public proc public DoDrop(thing where, who, what)status:
  801.     action a;
  802.     string whatName;
  803.     status st;
  804.  
  805.     /* NOTE: we do any object-specific stuff first. The mixture of the
  806.        fighting stuff and the garbage room relies on this. */
  807.     st := continue;
  808.     a := what@p_oUnGetChecker;
  809.     if a ~= nil then
  810.     SetIt(what);
  811.     st := call(a, status)(what);
  812.     fi;
  813.     if st = continue then
  814.     a := what@p_oDropChecker;
  815.     if a ~= nil then
  816.         SetIt(what);
  817.         st := call(a, status)(what);
  818.     fi;
  819.     fi;
  820.     if st = continue then
  821.     /* it wasn't a bomb that blew up or anything */
  822.     st := DoRoomDropChecks(where, what);
  823.     if st = continue then
  824.         /* nothing funny about dropping things here */
  825.         AddTail(where@p_rContents, what);
  826.         DelElement(who@p_pCarrying, what);
  827.         what -- p_oCarryer;
  828.         what@p_oWhere := where;
  829.         whatName := FormatName(what@p_oName);
  830.         SPrint(who, whatName + ": dropped.\n");
  831.         if CanSee(where, who) then
  832.         if who@p_pHidden then
  833.             ABPrint(where, who, who, "The " + whatName +
  834.                 " appears from nowhere and drops.\n");
  835.         else
  836.             ABPrint(where, who, who, FormatName(who@p_pName) +
  837.             " has dropped the " + whatName + ".\n");
  838.         fi;
  839.         fi;
  840.         continue
  841.     else
  842.         st
  843.     fi
  844.     else
  845.     st
  846.     fi
  847. corp;
  848.  
  849. define tp_verbs proc dropAllStub(thing object)bool:
  850.  
  851.     DoDrop(Here(), Me(), object) ~= fail
  852. corp;
  853.  
  854. define tp_verbs proc v_drop(string what)bool:
  855.     thing me, object;
  856.     string whatName;
  857.     status st;
  858.  
  859.     me := Me();
  860.     if what = "" then
  861.     Print("You must specify what you want to drop.\n");
  862.     false
  863.     elif what == "all" then
  864.     st := DoAll(me@p_pCarrying, dropAllStub);
  865.     if st = fail then
  866.         Print("You are not carrying anything obvious to drop.\n");
  867.         false
  868.     else
  869.         st = continue
  870.     fi
  871.     else
  872.     whatName := FormatName(what);
  873.     st := FindName(me@p_pCarrying, p_oName, what);
  874.     if st = succeed then
  875.         object := FindResult();
  876.         DoDrop(Here(), me, object) ~= fail
  877.     elif st = continue then
  878.         Print(whatName + " is ambiguous.\n");
  879.         false
  880.     else
  881.         Print(AAn("You are not carrying", whatName) + ".\n");
  882.         false
  883.     fi
  884.     fi
  885. corp;
  886.  
  887. Verb1(G, "put", FindAnyWord(G, "down"), v_drop).
  888. Verb1(G, "drop", 0, v_drop).
  889.  
  890. /* the fancy Verb2 ones */
  891.  
  892. define tp_verbs proc v_give(string what, toWho)bool:
  893.     string whatName, whoName, myName;
  894.     status st;
  895.     thing me, here, item, who;
  896.     action a;
  897.     character ch;
  898.     int len;
  899.  
  900.     whatName := FormatName(what);
  901.     whoName := FormatName(toWho);
  902.     me := Me();
  903.     here := Here();
  904.     myName := FormatName(me@p_pName);
  905.     who := FindAgent(toWho);
  906.     if who = me then
  907.     Print("There is no point in giving to yourself.\n");
  908.     false
  909.     elif who = nil then
  910.     if MatchName(here@p_rScenery, toWho) ~= -1 then
  911.         Print("You can't give things to the scenery!\n");
  912.     else
  913.         Print(whoName + " is not here!\n");
  914.     fi;
  915.     false
  916.     elif Count(who@p_pCarrying) >= MAX_CARRY then
  917.     Print(whoName + " can't carry anything else.\n");
  918.     false
  919.     else
  920.     st := FindName(me@p_pCarrying, p_oName, what);
  921.     if st = succeed then
  922.         item := FindResult();
  923.         SetIt(item);
  924.         st := continue;
  925.         a := item@p_oUnGetChecker;
  926.         if a ~= nil then
  927.         st := call(a, status)(item);
  928.         fi;
  929.         if st = continue then
  930.         a := who@p_pGivePre;
  931.         if a ~= nil then
  932.             st := ForceAction(who, a);
  933.         fi;
  934.         fi;
  935.         if st = continue then
  936.         a := item@p_oGiveChecker;
  937.         if a ~= nil then
  938.             st := call(a, status)(who);
  939.         fi;
  940.         fi;
  941.         if st = continue then
  942.         a := who@p_pGivePost;
  943.         if a ~= nil then
  944.             st := ForceAction(who, a);
  945.         fi;
  946.         fi;
  947.         if st = continue then
  948.         /* cannot use CarryItem here - wrong person is running */
  949.         AddTail(who@p_pCarrying, item);
  950.         DelElement(me@p_pCarrying, item);
  951.         item@p_oCarryer := who;
  952.         if item@p_oCreator = me then
  953.             ch := ThingCharacter(who);
  954.             if ch = nil then
  955.             ch := SysAdmin;
  956.             fi;
  957.             item@p_oCreator := who;
  958.         fi;
  959.         Print("You give the " + whatName + " to " + whoName + ".\n");
  960.         if not me@p_pHidden and CanSee(here, who) then
  961.             SPrint(who, AAn(myName + " gives you", whatName) + ".\n");
  962.             ABPrint(here, me, who, AAn(myName + " gives", whatName) +
  963.             " to " + whoName + ".\n");
  964.         else
  965.             SPrint(who, AAn("Someone gives you", whatName) + ".\n");
  966.         fi;
  967.         true
  968.         else
  969.         st = succeed
  970.         fi
  971.     elif st = continue then
  972.         Print(whatName + " is ambiguous.\n");
  973.         false
  974.     else
  975.         if SubString(what, 0, 5) == "bluto" then
  976.         len := Length(what) - 5;
  977.         what := SubString(what, 5, len);
  978.         if SubString(what, 0, 1) == "s" then
  979.             len := len - 1;
  980.             what := SubString(what, 1, len);
  981.         fi;
  982.         if SubString(what, 0, 1) == ";" then
  983.             len := len - 1;
  984.             what := SubString(what, 1, len);
  985.         fi;
  986.         if len = 0 then
  987.             Print("You must say how many blutos to give.\n");
  988.             false
  989.         else
  990.             len := StringToPosInt(what);
  991.             if len < 0 then
  992.             Print("Invalid bluto count.\n");
  993.             false
  994.             else
  995.             if len > me@p_pMoney then
  996.                 Print("You don't have that many!\n");
  997.                 false
  998.             else
  999.                 if not me@p_pHidden and CanSee(here, who) then
  1000.                 if len = 1 then
  1001.                     Print("You give one bluto to " +
  1002.                     whoName + ".\n");
  1003.                     SPrint(who, myName +
  1004.                     " gives you one bluto.\n");
  1005.                 else
  1006.                     Print("You give " + IntToString(len) +
  1007.                     " blutos to " + whoName + ".\n");
  1008.                     SPrint(who, myName + " gives you " +
  1009.                     IntToString(len) + " blutos.\n");
  1010.                 fi;
  1011.                 ABPrint(here, me, who,
  1012.                     " gives some blutos to " + whoName +
  1013.                     ".\n");
  1014.                 else
  1015.                 if len = 1 then
  1016.                     SPrint(who,
  1017.                     "Someone gives you one bluto.\n");
  1018.                 else
  1019.                     SPrint(who, "Some one gives you " +
  1020.                     IntToString(len) + " blutos.\n");
  1021.                 fi;
  1022.                 fi;
  1023.                 me@p_pMoney := me@p_pMoney - len;
  1024.                 who@p_pMoney := who@p_pMoney + len;
  1025.                 true
  1026.             fi
  1027.             fi
  1028.         fi
  1029.         else
  1030.         Print(AAn("You are not carrying", whatName) + ".\n");
  1031.         false
  1032.         fi
  1033.     fi
  1034.     fi
  1035. corp;
  1036.  
  1037. Verb2(G, "give", FindAnyWord(G, "to"), v_give).
  1038. Synonym(G, "give", "donate").
  1039. Synonym(G, "give", "grant").
  1040.  
  1041. define tp_verbs proc v_putIn(string itemRaw, containerRaw)bool:
  1042.     string itemName, containerName;
  1043.     thing me, item, container;
  1044.     status st;
  1045.     list thing lt;
  1046.     action a;
  1047.  
  1048.     itemName := FormatName(itemRaw);
  1049.     containerName := FormatName(containerRaw);
  1050.     me := Me();
  1051.     st := FindName(me@p_pCarrying, p_oName, itemRaw);
  1052.     if st = fail then
  1053.     Print(AAn("You aren't carrying", itemName) + ".\n");
  1054.     false
  1055.     elif st = continue then
  1056.     Print(itemName + " is ambiguous.\n");
  1057.     false
  1058.     else
  1059.     item := FindResult();
  1060.     st := FindName(me@p_pCarrying, p_oName, containerRaw);
  1061.     if st = fail then
  1062.         st := FindName(Here()@p_rContents, p_oName, containerRaw);
  1063.     fi;
  1064.     if st = fail then
  1065.         if MatchName(Here()@p_rScenery, containerRaw) ~= -1 then
  1066.         Print("You can't put things into the " +containerName + ".\n");
  1067.         else
  1068.         Print("There is no " + containerName + " here.\n");
  1069.         fi;
  1070.         false
  1071.     elif st = continue then
  1072.         Print(containerName + " is ambiguous.\n");
  1073.         false
  1074.     else
  1075.         container := FindResult();
  1076.         lt := container@p_oContents;
  1077.         if lt = nil then
  1078.         Print("You can't put things into the " +containerName + ".\n");
  1079.         false
  1080.         elif item = container then
  1081.         Print("You can't put the " + itemName + " into itself!\n");
  1082.         false
  1083.         else
  1084.         st := continue;
  1085.         a := item@p_oUnGetChecker;
  1086.         if a ~= nil then
  1087.             st := call(a, status)(item);
  1088.         fi;
  1089.         if st = continue then
  1090.             a := item@p_oPutMeInChecker;
  1091.             if a ~= nil then
  1092.             st := call(a, status)(item, container);
  1093.             fi;
  1094.         fi;
  1095.         if st = continue then
  1096.             a := container@p_oPutInMeChecker;
  1097.             if a ~= nil then
  1098.             st := call(a, status)(item, container);
  1099.             elif Count(lt) >= container@p_oCapacity then
  1100.             Print("There is no room in the " + containerName +
  1101.                 " for the " + itemName + ".\n");
  1102.             st := fail;
  1103.             fi;
  1104.         fi;
  1105.         if st = continue then
  1106.             AddTail(lt, item);
  1107.             DelElement(me@p_pCarrying, item);
  1108.             item -- p_oCarryer;
  1109.             item@p_oWhere := container;
  1110.             Print("You put the " + itemName + " into the " +
  1111.             containerName + ".\n");
  1112.             true
  1113.         else
  1114.             st ~= fail
  1115.         fi
  1116.         fi
  1117.     fi
  1118.     fi
  1119. corp;
  1120.  
  1121. define tp_verbs proc v_takeFrom(string itemRaw, containerRaw)bool:
  1122.     string itemName, containerName;
  1123.     thing me, item, container;
  1124.     status st;
  1125.     list thing lt;
  1126.     action a;
  1127.  
  1128.     itemName := FormatName(itemRaw);
  1129.     containerName := FormatName(containerRaw);
  1130.     me := Me();
  1131.     st := FindName(me@p_pCarrying, p_oName, containerRaw);
  1132.     if st = fail then
  1133.     st := FindName(Here()@p_rContents, p_oName, containerRaw);
  1134.     fi;
  1135.     if st = fail then
  1136.     if MatchName(Here()@p_rScenery, containerRaw) ~= -1 then
  1137.         Print("You can't take things from the " + containerName + ".\n");
  1138.     else
  1139.         Print("There is no " + containerName + " here.\n");
  1140.     fi;
  1141.     false
  1142.     elif st = continue then
  1143.     Print(containerName + " is ambiguous.\n");
  1144.     false
  1145.     else
  1146.     container := FindResult();
  1147.     lt := container@p_oContents;
  1148.     if lt = nil then
  1149.         Print("There is nothing in the " + containerName + ".\n");
  1150.         false
  1151.     else
  1152.         st := FindName(container@p_oContents, p_oName, itemRaw);
  1153.         if st = fail then
  1154.         Print("There is no " + itemName + " in the " + containerName +
  1155.             ".\n");
  1156.         false
  1157.         elif st = continue then
  1158.         Print(itemName + " is ambiguous.\n");
  1159.         false
  1160.         elif Count(me@p_pCarrying) >= MAX_CARRY then
  1161.         Print("You can't carry anything else.\n");
  1162.         false
  1163.         else
  1164.         item := FindResult();
  1165.         st := continue;
  1166.         a := item@p_oTakeMeFromChecker;
  1167.         if a ~= nil then
  1168.             st := call(a, status)(item, container);
  1169.         fi;
  1170.         if st = continue then
  1171.             a := container@p_oTakeFromMeChecker;
  1172.             if a ~= nil then
  1173.             st := call(a, status)(item, container);
  1174.             fi;
  1175.         fi;
  1176.         if st = continue then
  1177.             a := item@p_oGetChecker;
  1178.             if a ~= nil then
  1179.             st := call(a, status)(item);
  1180.             fi;
  1181.         fi;
  1182.         if st = continue then
  1183.             AddTail(me@p_pCarrying, item);
  1184.             DelElement(container@p_oContents, item);
  1185.             item -- p_oWhere;
  1186.             item@p_oCarryer := me;
  1187.             Print("You take the " + itemName + " from the " +
  1188.             containerName + ".\n");
  1189.             true
  1190.         else
  1191.             st ~= fail
  1192.         fi
  1193.         fi
  1194.     fi
  1195.     fi
  1196. corp;
  1197.  
  1198. define tp_verbs proc v_lookIn(string containerRaw)bool:
  1199.     string containerName;
  1200.     thing me, here, container;
  1201.     status st;
  1202.     list thing lt;
  1203.  
  1204.     me := Me();
  1205.     here := Here();
  1206.     containerName := FormatName(containerRaw);
  1207.     st := FindName(me@p_pCarrying, p_oName, containerRaw);
  1208.     if st = fail then
  1209.     st := FindName(here@p_rContents, p_oName, containerRaw);
  1210.     fi;
  1211.     if st = fail then
  1212.     if MatchName(here@p_rScenery, containerRaw) ~= -1 then
  1213.         if not CanSee(here, me) then
  1214.         Print("It is dark.\n");
  1215.         else
  1216.         Print("There is nothing to see in the " + containerName +
  1217.             ".\n");
  1218.         fi;
  1219.     else
  1220.         Print("There is no " + containerName + " here.\n");
  1221.     fi;
  1222.     false
  1223.     elif st = continue then
  1224.     Print(containerName + " is ambiguous.\n");
  1225.     false
  1226.     else
  1227.     /* do this BEFORE calling CanSee! */
  1228.     container := FindResult();
  1229.     if not CanSee(here, me) then
  1230.         Print("It is dark.\n");
  1231.         false
  1232.     else
  1233.         lt := container@p_oContents;
  1234.         if lt = nil then
  1235.         Print("There is nothing in the " + containerName + ".\n");
  1236.         false
  1237.         else
  1238.         if ShowList(lt, "The " + containerName + " contains:\n") then
  1239.             Print("The " + containerName + " is empty.\n");
  1240.         fi;
  1241.         true
  1242.         fi
  1243.     fi
  1244.     fi
  1245. corp;
  1246.  
  1247. define tp_verbs proc v_insert0(string what)bool:
  1248.  
  1249.     Print("You must say what you want to insert the " + FormatName(what) +
  1250.     " into.\n");
  1251.     false
  1252. corp;
  1253.  
  1254. Verb2(G, "put", FindAnyWord(G, "in"), v_putIn).
  1255. Verb2(G, "put", FindAnyWord(G, "into"), v_putIn).
  1256. Verb2(G, "put", FindAnyWord(G, "inside"), v_putIn).
  1257. Verb2(G, "put", FindAnyWord(G, "on"), v_putIn).
  1258. Verb2(G, "put", FindAnyWord(G, "onto"), v_putIn).
  1259. /* Need to do separate verb for "insert", rather than making it a
  1260.    synonym of "put", since you cannot have something be both a synonym
  1261.    and a verb in its own right. */
  1262. Verb1(G, "insert", 0, v_insert0).
  1263. Verb2(G, "insert", FindAnyWord(G, "in"), v_putIn).
  1264. Verb2(G, "insert", FindAnyWord(G, "into"), v_putIn).
  1265. Verb2(G, "insert", FindAnyWord(G, "inside"), v_putIn).
  1266. Verb2(G, "get", FindAnyWord(G, "from"), v_takeFrom).
  1267. /* get will use synonyms for the other 'get' */
  1268. Verb1(G, "look", FindAnyWord(G, "in"), v_lookIn).
  1269. Verb1(G, "look", FindAnyWord(G, "inside"), v_lookIn).
  1270.  
  1271. define tp_verbs proc v_fillFrom(string containerRaw, itemRaw)bool:
  1272.     string itemName, containerName;
  1273.     thing me, item, container;
  1274.     status st;
  1275.     list thing lt;
  1276.     action a;
  1277.  
  1278.     containerName := FormatName(containerRaw);
  1279.     itemName := FormatName(itemRaw);
  1280.     me := Me();
  1281.     st := FindName(me@p_pCarrying, p_oName, containerRaw);
  1282.     if st = fail then
  1283.     Print(AAn("You aren't carrying", containerName) + ".\n");
  1284.     false
  1285.     elif st = continue then
  1286.     Print(containerName + " is ambiguous.\n");
  1287.     false
  1288.     else
  1289.     container := FindResult();
  1290.     st := FindName(me@p_pCarrying, p_oName, itemRaw);
  1291.     if st = fail then
  1292.         st := FindName(Here()@p_rContents, p_oName, itemRaw);
  1293.     fi;
  1294.     if st = fail then
  1295.         if MatchName(Here()@p_rScenery, itemRaw) ~= -1 then
  1296.         Print("You can't fill the " + containerName + " from the " +
  1297.             itemName + ".\n");
  1298.         else
  1299.         Print("There is no " + itemName + " here.\n");
  1300.         fi;
  1301.         false
  1302.     elif st = continue then
  1303.         Print(itemName + " is ambiguous.\n");
  1304.         false
  1305.     else
  1306.         item := FindResult();
  1307.         a := container@p_oFillMeWithChecker;
  1308.         if a = nil then
  1309.         Print("You can't fill the " + containerName + ".\n");
  1310.         false
  1311.         elif item = container then
  1312.         Print("You can't fill the " + itemName + " from itself!\n");
  1313.         false
  1314.         else
  1315.         st := call(a, status)(container, item);
  1316.         if st = continue then
  1317.             a := item@p_oFillWithMeChecker;
  1318.             if a ~= nil then
  1319.             st := call(a, status)(container, item);
  1320.             fi;
  1321.         fi;
  1322.         if st = continue then
  1323.             Print("You fill the " + containerName + " from the " +
  1324.             itemName + ".\n");
  1325.             true
  1326.         elif st = fail then
  1327.             Print("You can't fill the " + containerName +
  1328.             " from the " + itemName + ".\n");
  1329.             false
  1330.         else
  1331.             true
  1332.         fi
  1333.         fi
  1334.     fi
  1335.     fi
  1336. corp;
  1337.  
  1338. Verb2(G, "fill", FindAnyWord(G, "from"), v_fillFrom).
  1339. Verb2(G, "fill", FindAnyWord(G, "with"), v_fillFrom).
  1340.  
  1341. define t_base p_oNotUnlockString CreateStringProp().
  1342.  
  1343. define tp_verbs proc v_unlock(string lockRaw, keyRaw)bool:
  1344.     string keyName, lockName, str;
  1345.     thing me, key, lock;
  1346.     status st;
  1347.     list thing lt;
  1348.     action a;
  1349.  
  1350.     lockName := FormatName(lockRaw);
  1351.     keyName := FormatName(keyRaw);
  1352.     me := Me();
  1353.     st := FindName(Here()@p_rContents, p_oName, lockRaw);
  1354.     if st = fail then
  1355.     if MatchName(Here()@p_rScenery, lockRaw) ~= -1 then
  1356.         Print("You can't unlock the " + lockName + ".\n");
  1357.     else
  1358.         Print("There is no " + lockName + " here.\n");
  1359.     fi;
  1360.     false
  1361.     elif st = continue then
  1362.     Print(lockName + " is ambiguous.\n");
  1363.     false
  1364.     else
  1365.     lock := FindResult();
  1366.     if lock@p_oNotLocked then
  1367.         Print("The " + lockName + " is not locked.\n");
  1368.         false
  1369.     else
  1370.         st := FindName(me@p_pCarrying, p_oName, keyRaw);
  1371.         if st = fail then
  1372.         Print(AAn("You aren't carrying", keyName) + ".\n");
  1373.         false
  1374.         elif st = continue then
  1375.         Print(keyName + " is ambiguous.\n");
  1376.         false
  1377.         else
  1378.         key := FindResult();
  1379.         a := lock@p_oUnlockMeWithChecker;
  1380.         if a = nil then
  1381.             if lock@p_oNotUnlockString ~= "" then
  1382.             Print(lock@p_oNotUnlockString + "\n");
  1383.             else
  1384.             Print("You can't unlock the " + lockName + ".\n");
  1385.             fi;
  1386.             false
  1387.         elif key = lock then
  1388.             Print("You can't unlock the " + lockName +
  1389.             " with itself!\n");
  1390.             false
  1391.         else
  1392.             st := call(a, status)(lock, key);
  1393.             if st = continue then
  1394.             a := key@p_oUnlockWithMeChecker;
  1395.             if a ~= nil then
  1396.                 st := call(a, status)(lock, key);
  1397.             fi;
  1398.             fi;
  1399.             if st = continue then
  1400.             Print("You unlock the " + lockName + " with the " +
  1401.                 keyName + ".\n");
  1402.             true
  1403.             elif st = fail then
  1404.             Print("You can't unlock the " + lockName +
  1405.                 " with the " + keyName + ".\n");
  1406.             false
  1407.             else
  1408.             true
  1409.             fi
  1410.         fi
  1411.         fi
  1412.     fi
  1413.     fi
  1414. corp;
  1415.  
  1416. Verb2(G, "unlock", FindAnyWord(G, "with"), v_unlock).
  1417.  
  1418. define tp_verbs proc v_follow(string name)bool:
  1419.     thing me, who;
  1420.  
  1421.     me := Me();
  1422.     if name = "" then
  1423.     who := me@p_pFollowing;
  1424.     if who ~= nil then
  1425.         name := FormatName(who@p_pName);
  1426.         Print("You are currently following " + name + ".\n");
  1427.         true
  1428.     else
  1429.         Print("You must specify who you want to follow.\n");
  1430.         Print("Use 'unfollow', or just move, to stop following.\n");
  1431.         false
  1432.     fi
  1433.     else
  1434.     who := FindAgent(name);
  1435.     name := FormatName(name);
  1436.     if who = me then
  1437.         Print("You can't follow yourself.\n");
  1438.         false
  1439.     elif who = nil then
  1440.         if MatchName(Here()@p_rScenery, name) ~= -1 then
  1441.         Print("You can't follow the scenery!\n");
  1442.         else
  1443.         Print(name + " is not here!\n");
  1444.         fi;
  1445.         false
  1446.     else
  1447.         UnFollow();
  1448.         Follow(who);
  1449.         Print("You are now following " + name + ".\n");
  1450.         true
  1451.     fi
  1452.     fi
  1453. corp;
  1454.  
  1455. Verb1(G, "follow", 0, v_follow).
  1456.  
  1457. define tp_verbs proc v_unfollow()bool:
  1458.  
  1459.     if Me()@p_pFollowing = nil then
  1460.     Print("You are not following anyone.\n");
  1461.     false
  1462.     else
  1463.     UnFollow();
  1464.     true
  1465.     fi
  1466. corp;
  1467.  
  1468. Verb0(G, "unfollow", 0, v_unfollow).
  1469.  
  1470. /* a few utility-type commands */
  1471.  
  1472. define tp_verbs proc v_quit()bool:
  1473.     /* Bit of a nuisance - the server handles the messages for coming and
  1474.        going from the world, and it knows nothing of p_pHidden. Oh well. */
  1475.     Quit();
  1476.     ClearFollowers(Me());
  1477.     false
  1478. corp;
  1479.  
  1480. Verb0(G, "quit", 0, v_quit).
  1481. Synonym(G, "quit", "bye").
  1482. Synonym(G, "quit", "off").
  1483.  
  1484. define tp_verbs proc v_time()bool:
  1485.     Print("The time and date at the server is: " + Date() + ".\n");
  1486.     true
  1487. corp;
  1488.  
  1489. Verb0(G, "time", 0, v_time).
  1490. Verb0(G, "date", 0, v_time).
  1491.  
  1492. define tp_verbs proc v_verbose()bool:
  1493.     thing me;
  1494.  
  1495.     me := Me();
  1496.     if me@p_pVerbose then
  1497.     Print("You are already getting verbose descriptions!\n");
  1498.     false
  1499.     else
  1500.     me@p_pVerbose := true;
  1501.     me@p_pSuperBrief := false;
  1502.     Print("Verbose desciptions turned on.\n");
  1503.     true
  1504.     fi
  1505. corp;
  1506.  
  1507. Verb0(G, "verbose", 0, v_verbose).
  1508.  
  1509. define tp_verbs proc v_terse()bool:
  1510.     thing me;
  1511.  
  1512.     me := Me();
  1513.     if me@p_pSuperBrief then
  1514.     me@p_pSuperBrief := false;
  1515.     Print("Superterse mode turned off.\n");
  1516.     true
  1517.     elif me@p_pVerbose then
  1518.     me@p_pVerbose := false;
  1519.     Print("Verbose descriptions turned off.\n");
  1520.     true
  1521.     else
  1522.     Print("You are already in terse mode!\n");
  1523.     false
  1524.     fi
  1525. corp;
  1526.  
  1527. Verb0(G, "terse", 0, v_terse).
  1528. Synonym(G, "terse", "brief").
  1529.  
  1530. define tp_verbs proc v_superterse()bool:
  1531.     thing me;
  1532.  
  1533.     me := Me();
  1534.     if me@p_pSuperBrief then
  1535.     Print("You are already in superterse mode!\n");
  1536.     false
  1537.     else
  1538.     me@p_pVerbose := false;
  1539.     me@p_pSuperBrief := true;
  1540.     Print("Superterse mode enabled.\n");
  1541.     true
  1542.     fi
  1543. corp;
  1544.  
  1545. Verb0(G, "superterse", 0, v_superterse).
  1546. Synonym(G, "superterse", "superbrief").
  1547.  
  1548. define tp_verbs proc v_echo()bool:
  1549.     thing me;
  1550.  
  1551.     me := Me();
  1552.     if me@p_pEchoPose then
  1553.     me@p_pEchoPose := false;
  1554.     Print("Say/whisper/poses will no longer be echoed to you.\n");
  1555.     else
  1556.     me@p_pEchoPose := true;
  1557.     Print("Say/whisper/poses will now be echoed to you.\n");
  1558.     fi;
  1559.     true
  1560. corp;
  1561.  
  1562. Verb0(G, "echo", 0, v_echo).
  1563.  
  1564. define tp_verbs proc v_ats()bool:
  1565.     bool oldValue;
  1566.  
  1567.     oldValue := PrintNoAts(true);
  1568.     if oldValue then
  1569.     Print("Non-wizard output will now be identified by leading '@'s.\n");
  1570.     ignore PrintNoAts(false);
  1571.     else
  1572.     Print(
  1573. "Non-wizard output will no longer be identified by leading '@'s. You are "
  1574. "warned that unscrupulous apprentices may attempt to trick you by printing "
  1575. "false messages indistinguishable from normal messages. E.g.\n\n"
  1576. "SysAdmin gives you 10000 blutos.\n\n"
  1577. "Beware of this type of \"spoofing\".\n");
  1578.     ignore PrintNoAts(true);
  1579.     fi;
  1580.     true
  1581. corp;
  1582.  
  1583. Verb0(G, "ats", 0, v_ats).
  1584.  
  1585. define tp_verbs proc v_wizard()bool:
  1586.     if not WizardMode() then
  1587.     Print("Sorry, you can't go into wizard mode.\n");
  1588.     false
  1589.     else
  1590.     true
  1591.     fi
  1592. corp;
  1593.  
  1594. Verb0(G, "wizard", 0, v_wizard).
  1595.  
  1596. define tp_verbs proc v_hide()bool:
  1597.     thing me;
  1598.  
  1599.     me := Me();
  1600.     if IsWizard() then
  1601.     if me@p_pHidden then
  1602.         Print("You are now visible to others.\n");
  1603.         me@p_pHidden := false;
  1604.         OPrint(FormatName(me@p_pName) + " fades into view.\n");
  1605.         ForEachAgent(Here(), ShowIconOnce);
  1606.     else
  1607.         Print("You are no longer visible to others.\n");
  1608.         me@p_pHidden := true;
  1609.         OPrint(FormatName(me@p_pName) + " fades out of view.\n");
  1610.         ForEachAgent(Here(), UnShowIconOnce);
  1611.         ClearFollowers(me);
  1612.     fi;
  1613.     true
  1614.     else
  1615.     Print("Hide? This isn't a game of hide and seek!\n");
  1616.     false
  1617.     fi
  1618. corp;
  1619.  
  1620. Verb0(G, "hide", 0, v_hide).
  1621.  
  1622. define tp_verbs proc v_password()bool:
  1623.     NewCharacterPassword();
  1624.     true
  1625. corp;
  1626.  
  1627. Verb0(G, "password", 0, v_password).
  1628.  
  1629. define tp_verbs proc v_prompt()bool:
  1630.     ignore SetPrompt(GetWord());
  1631.     true
  1632. corp;
  1633.  
  1634. VerbTail(G, "prompt", v_prompt).
  1635.  
  1636. define tp_verbs proc v_name(string newName)bool:
  1637.     string oldName;
  1638.  
  1639.     if newName = "" then
  1640.     Print("You must give the new name you want to use.\n");
  1641.     false
  1642.     else
  1643.     SetTail(newName);
  1644.     ignore GetWord();
  1645.     if GetWord() ~= "" then
  1646.         Print("Sorry, no spaces in character names.\n");
  1647.         false
  1648.     else
  1649.         oldName := Me()@p_pName;
  1650.         ChangeName(newName);
  1651.         Print("Your name is now " + newName + ".\n");
  1652.         APrint(oldName + " is now called " + newName + ".\n");
  1653.         true
  1654.     fi
  1655.     fi
  1656. corp;
  1657.  
  1658. Verb1(G, "name", 0, v_name).
  1659.  
  1660. /*
  1661.  * v_say - handler for speaking. Attempt to catch the likely forms.
  1662.  *    say hello => hello
  1663.  *    say to fred hello => fred hello
  1664.  *    tell joe to blah blah => joe blah blah
  1665.  */
  1666.  
  1667. define tp_verbs proc v_say()bool:
  1668.     string word1, word2, tail;
  1669.  
  1670.     word1 := GetWord();
  1671.     if word1 = "" then
  1672.     Print("Put what you want to say after the 'say'.\n");
  1673.     else
  1674.     word2 := GetWord();
  1675.     tail := GetTail();
  1676.     if word2 == "to" then
  1677.         if tail = "" then
  1678.         DoSay(word1);
  1679.         else
  1680.         DoSay(word1 + " " + tail);
  1681.         fi;
  1682.     else
  1683.         if tail = "" then
  1684.         if word2 = "" then
  1685.             DoSay(word1);
  1686.         else
  1687.             DoSay(word1 + " " + word2);
  1688.         fi;
  1689.         else
  1690.         DoSay(word1 + " " + word2 + " " + tail);
  1691.         fi;
  1692.     fi;
  1693.     fi;
  1694.     true
  1695. corp;
  1696.  
  1697. VerbTail(G, "say", v_say).
  1698. Synonym(G, "say", "\"").
  1699. Synonym(G, "say", "tell").
  1700.  
  1701. /*
  1702.  * showAliases - used in 'v_alias' and in v_aliases.
  1703.  */
  1704.  
  1705. define tp_verbs proc showAliases(list thing aliases)void:
  1706.     thing alias;
  1707.     int count;
  1708.  
  1709.     if aliases = nil then
  1710.     Print("You have no command aliases.\n");
  1711.     else
  1712.     count := Count(aliases);
  1713.     Print("Command aliases:\n");
  1714.     while count ~= 0 do
  1715.         count := count - 1;
  1716.         alias := aliases[count];
  1717.         Print("  ");
  1718.         Print(alias@p_sAliasKey);
  1719.         Print(" => ");
  1720.         Print(alias@p_sAliasValue);
  1721.         Print("\n");
  1722.     od;
  1723.     fi;
  1724. corp;
  1725.  
  1726. define tp_verbs proc v_aliases()bool:
  1727.  
  1728.     showAliases(Me()@p_pAliases);
  1729.     true
  1730. corp;
  1731.  
  1732. define tp_verbs proc v_alias()bool:
  1733.     list thing aliases;
  1734.     thing alias;
  1735.     string word, contents;
  1736.     int count;
  1737.     bool found;
  1738.  
  1739.     word := GetWord();
  1740.     aliases := Me()@p_pAliases;
  1741.     if word = "" then
  1742.     showAliases(aliases);
  1743.     else
  1744.     Print("Command alias '");
  1745.     Print(word);
  1746.     Print("' ");
  1747.     found := false;
  1748.     if aliases ~= nil then
  1749.         count := Count(aliases);
  1750.         while count ~= 0 and not found do
  1751.         count := count - 1;
  1752.         alias := aliases[count];
  1753.         if alias@p_sAliasKey == word then
  1754.             found := true;
  1755.         fi;
  1756.         od;
  1757.     fi;
  1758.     contents := GetTail();
  1759.     if contents = "" then
  1760.         if found then
  1761.         ClearThing(alias);
  1762.         DelElement(aliases, alias);
  1763.         Print("removed.\n");
  1764.         else
  1765.         Print("does not exist.\n");
  1766.         fi;
  1767.     else
  1768.         if SubString(contents, 0, 1) = "\"" then
  1769.         contents := SubString(contents, 1, Length(contents) - 2);
  1770.         fi;
  1771.         if found then
  1772.         alias@p_sAliasValue := contents;
  1773.         Print("updated.\n");
  1774.         else
  1775.         if aliases = nil then
  1776.             aliases := CreateThingList();
  1777.             Me()@p_pAliases := aliases;
  1778.         fi;
  1779.         alias := CreateThing(nil);
  1780.         alias@p_sAliasKey := word;
  1781.         alias@p_sAliasValue := contents;
  1782.         AddTail(aliases, alias);
  1783.         Print("added.\n");
  1784.         fi;
  1785.     fi;
  1786.     fi;
  1787.     true
  1788. corp;
  1789.  
  1790. Verb0(G, "aliases", 0, v_aliases).
  1791. VerbTail(G, "alias", v_alias).
  1792. Synonym(G, "alias", "a").
  1793.  
  1794. define tp_verbs proc v_characters(string form)bool:
  1795.  
  1796.     if form == "long" or form == "l" then
  1797.     ignore ShowCharacters(true);
  1798.     true
  1799.     elif form = "" or form == "short" or form == "s" then
  1800.     ignore ShowCharacters(false);
  1801.     true
  1802.     else
  1803.     Print("You must use either \"short\" or \"long\".\n");
  1804.     false
  1805.     fi
  1806. corp;
  1807.  
  1808. Verb1(G, "characters", 0, v_characters).
  1809. Synonym(G, "characters", "chars").
  1810. Synonym(G, "characters", "ch").
  1811. Synonym(G, "characters", "players").
  1812. Synonym(G, "characters", "pl").
  1813.  
  1814. define tp_verbs proc v_clients(string form)bool:
  1815.  
  1816.     if form == "long" or form == "l" then
  1817.     ignore ShowClients(true);
  1818.     true
  1819.     elif form = "" or form == "short" or form == "s" then
  1820.     ignore ShowClients(false);
  1821.     true
  1822.     else
  1823.     Print("You must use either \"short\" or \"long\".\n");
  1824.     false
  1825.     fi
  1826. corp;
  1827.  
  1828. Verb1(G, "clients", 0, v_clients).
  1829. Synonym(G, "clients", "cl").
  1830.  
  1831. define tp_verbs proc v_character(string who)bool:
  1832.     character ch;
  1833.  
  1834.     if who = "" then
  1835.     Print("You must specify a character to check on.\n");
  1836.     false
  1837.     else
  1838.     ch := Character(who);
  1839.     if ch = nil then
  1840.         ch := Character(Capitalize(who));
  1841.     fi;
  1842.     if ch = nil then
  1843.         Print(who + " is not a character. Make sure you have the spelling "
  1844.         "and capitalization correct.\n");
  1845.     else
  1846.         ShowCharacter(ch);
  1847.     fi;
  1848.     true
  1849.     fi
  1850. corp;
  1851.  
  1852. Verb1(G, "character", 0, v_character).
  1853. Synonym(G, "character", "player").
  1854.  
  1855. define tp_verbs proc v_who()bool:
  1856.     Print("Use 'characters [long|short]' to see existing characters.\n"
  1857.     "Use 'clients [long|short]' to see current clients.\n"
  1858.     "Use 'character <name>, ...' to see given characters.\n");
  1859.     true
  1860. corp;
  1861.  
  1862. Verb0(G, "who", 0, v_who).
  1863.  
  1864. define tp_verbs proc v_width(string newWidth)bool:
  1865.     int width;
  1866.  
  1867.     if newWidth = "" then
  1868.     width := TextWidth(0);
  1869.     Print("Current display width is " + IntToString(width) + ".\n");
  1870.     else
  1871.     Print("Old width was " +
  1872.         IntToString(TextWidth(StringToPosInt(newWidth))) + ".\n");
  1873.     fi;
  1874.     true
  1875. corp;
  1876.  
  1877. Verb1(G, "width", 0, v_width).
  1878.  
  1879. define tp_verbs proc v_height(string newHeight)bool:
  1880.     int height;
  1881.  
  1882.     if newHeight = "" then
  1883.     height := TextHeight(0);
  1884.     Print("Current display height is " + IntToString(height) + ".\n");
  1885.     else
  1886.     Print("Old height was " +
  1887.         IntToString(TextHeight(StringToPosInt(newHeight))) + ".\n");
  1888.     fi;
  1889.     true
  1890. corp;
  1891.  
  1892. Verb1(G, "height", 0, v_height).
  1893.  
  1894. define tp_verbs proc v_volume()bool:
  1895.     string error, which, volString;
  1896.     int newVolume;
  1897.  
  1898.     error := "Use is: volume {sound | voice | music} <value:0-100>\n";
  1899.     which := GetWord();
  1900.     volString := GetWord();
  1901.     newVolume := StringToPosInt(volString);
  1902.     if newVolume >= 0 and newVolume <= 100 then
  1903.     newVolume := newVolume * 100;
  1904.     if which == "sound" then
  1905.         SVolume(nil, newVolume);
  1906.         true
  1907.     elif which == "voice" then
  1908.         VVolume(nil, newVolume);
  1909.         true
  1910.     elif which == "music" then
  1911.         MVolume(nil, newVolume);
  1912.         true
  1913.     else
  1914.         Print(error);
  1915.         false
  1916.     fi
  1917.     else
  1918.     Print(error);
  1919.     false
  1920.     fi
  1921. corp;
  1922.  
  1923. VerbTail(G, "volume", v_volume).
  1924.  
  1925. define tp_verbs proc v_help()bool:
  1926.     Print("Standard commands available in this starter dungeon:\n"
  1927.     "    [go] north/south.../n/s/...enter/exit/up/down...\n"
  1928.     "    look [around]; look at XXX, YYY, ...; examine XXX; look <direction>\n"
  1929.     "    inventory/inv/i\n"
  1930.     "    pick up XXX, YYY, ...; get/g XXX, YYY, ...\n"
  1931.     "    put/p [down] XXX, YYY, ...; drop XXX, YYY, ...\n"
  1932.     "    say XXX; \"xxx; smile; wave; quests [who]\n"
  1933.     "    quit; verbose; terse; password; prompt; name; who; height; width;\n"
  1934.     "    play; erase; eat; use; wear; read; touch; smell; open; close;\n"
  1935.     "    push; pull; turn; chat; echo; etc.\n"
  1936.     "plus others as the game features require.\n");
  1937.     true
  1938. corp;
  1939.  
  1940. Verb0(G, "help", 0, v_help).
  1941. Synonym(G, "help", "?").
  1942.  
  1943. define tp_verbs proc v_words()bool:
  1944.     ShowWords(G);
  1945.     true
  1946. corp;
  1947.  
  1948. Verb0(G, "words", 0, v_words).
  1949.  
  1950. define tp_verbs proc v_shop()bool:
  1951.     ShowForSale();
  1952.     true
  1953. corp;
  1954.  
  1955. Verb0(G, "shop", 0, v_shop).
  1956. Synonym(G, "shop", "price").
  1957. Synonym(G, "shop", "prices").
  1958. Synonym(G, "shop", "cost").
  1959.  
  1960. /* use the generic verb stuff for some typical verbs */
  1961.  
  1962. define t_base p_oPlayString CreateStringProp().
  1963. define t_base p_oPlayChecker CreateActionProp().
  1964. define t_base p_pPlayChecker CreateActionProp().
  1965. define t_base p_oEraseString CreateStringProp().
  1966. define t_base p_oEraseChecker CreateActionProp().
  1967. define t_base p_pEraseChecker CreateActionProp().
  1968. define t_base p_oEatString CreateStringProp().
  1969. define t_base p_oEatChecker CreateActionProp().
  1970. define t_base p_pEatChecker CreateActionProp().
  1971. define t_base p_oUseString CreateStringProp().
  1972. define t_base p_oUseChecker CreateActionProp().
  1973. define t_base p_pUseChecker CreateActionProp().
  1974. define t_base p_oActivateString CreateStringProp().
  1975. define t_base p_oActivateChecker CreateActionProp().
  1976. define t_base p_pActivateChecker CreateActionProp().
  1977. define t_base p_oDeActivateString CreateStringProp().
  1978. define t_base p_oDeActivateChecker CreateActionProp().
  1979. define t_base p_pDeActivateChecker CreateActionProp().
  1980. define t_base p_oLightString CreateStringProp().
  1981. define t_base p_oLightChecker CreateActionProp().
  1982. define t_base p_pLightChecker CreateActionProp().
  1983. define t_base p_oExtinguishString CreateStringProp().
  1984. define t_base p_oExtinguishChecker CreateActionProp().
  1985. define t_base p_pExtinguishChecker CreateActionProp().
  1986. define t_base p_oWearString CreateStringProp().
  1987. define t_base p_oWearChecker CreateActionProp().
  1988. define t_base p_pWearChecker CreateActionProp().
  1989. define t_base p_oTouchString CreateStringProp().
  1990. define t_base p_oTouchChecker CreateActionProp().
  1991. define t_base p_pTouchChecker CreateActionProp().
  1992. define t_base p_oSmellString CreateStringProp().
  1993. define t_base p_oSmellChecker CreateActionProp().
  1994. define t_base p_pSmellChecker CreateActionProp().
  1995. define t_base p_oListenString CreateStringProp().
  1996. define t_base p_oListenChecker CreateActionProp().
  1997. define t_base p_pListenChecker CreateActionProp().
  1998. define t_base p_oOpenString CreateStringProp().
  1999. define t_base p_oOpenChecker CreateActionProp().
  2000. define t_base p_pOpenChecker CreateActionProp().
  2001. define t_base p_oCloseString CreateStringProp().
  2002. define t_base p_oCloseChecker CreateActionProp().
  2003. define t_base p_pCloseChecker CreateActionProp().
  2004. define t_base p_oPushString CreateStringProp().
  2005. define t_base p_oPushChecker CreateActionProp().
  2006. define t_base p_pPushChecker CreateActionProp().
  2007. define t_base p_oPullString CreateStringProp().
  2008. define t_base p_oPullChecker CreateActionProp().
  2009. define t_base p_pPullChecker CreateActionProp().
  2010. define t_base p_oTurnString CreateStringProp().
  2011. define t_base p_oTurnChecker CreateActionProp().
  2012. define t_base p_pTurnChecker CreateActionProp().
  2013. define t_base p_oLiftString CreateStringProp().
  2014. define t_base p_oLiftChecker CreateActionProp().
  2015. define t_base p_pLiftChecker CreateActionProp().
  2016. define t_base p_oLowerString CreateStringProp().
  2017. define t_base p_oLowerChecker CreateActionProp().
  2018. define t_base p_pLowerChecker CreateActionProp().
  2019.  
  2020. define t_base proc utility public GetVerbStringProp(string verb)
  2021.     property string:
  2022.     case MatchName(
  2023.     "play."
  2024.     "erase."
  2025.     "eat,lick,taste,drink,quaff,imbibe."
  2026.     "use,apply."
  2027.     "activate."
  2028.     "deactivate."
  2029.     "light."
  2030.     "extinguish."
  2031.     "wear."
  2032.     "touch,feel,pet."
  2033.     "smell,sniff."
  2034.     "listen."
  2035.     "open."
  2036.     "close,shut."
  2037.     "push,shove."
  2038.     "pull,yank,jerk,tug."
  2039.     "turn,twist,rotate,spin."
  2040.     "lift,raise."
  2041.     "lower."
  2042.     "get,take."
  2043.     "unlock"
  2044.     , verb)
  2045.     incase 0:
  2046.     p_oPlayString
  2047.     incase 1:
  2048.     p_oEraseString
  2049.     incase 2:
  2050.     p_oEatString
  2051.     incase 3:
  2052.     p_oUseString
  2053.     incase 4:
  2054.     p_oActivateString
  2055.     incase 5:
  2056.     p_oDeActivateString
  2057.     incase 6:
  2058.     p_oLightString
  2059.     incase 7:
  2060.     p_oExtinguishString
  2061.     incase 8:
  2062.     p_oWearString
  2063.     incase 9:
  2064.     p_oTouchString
  2065.     incase 10:
  2066.     p_oSmellString
  2067.     incase 11:
  2068.     p_oListenString
  2069.     incase 12:
  2070.     p_oOpenString
  2071.     incase 13:
  2072.     p_oCloseString
  2073.     incase 14:
  2074.     p_oPushString
  2075.     incase 15:
  2076.     p_oPullString
  2077.     incase 16:
  2078.     p_oTurnString
  2079.     incase 17:
  2080.     p_oLiftString
  2081.     incase 18:
  2082.     p_oLowerString
  2083.     incase 19:
  2084.     p_oNotGetString
  2085.     incase 20:
  2086.     p_oNotUnlockString
  2087.     default:
  2088.     nil
  2089.     esac
  2090. corp;
  2091.  
  2092. define t_base proc utility public GetVerbCheckerProp(string verb)
  2093.     property action:
  2094.     case MatchName(
  2095.     "play."
  2096.     "erase."
  2097.     "eat,lick,taste,drink,quaff,imbibe."
  2098.     "use,apply."
  2099.     "activate."
  2100.     "deactivate."
  2101.     "light."
  2102.     "extinguish."
  2103.     "wear."
  2104.     "touch,feel,pet."
  2105.     "smell,sniff."
  2106.     "listen."
  2107.     "open."
  2108.     "close,shut."
  2109.     "push,shove."
  2110.     "pull,yank,jerk,tug."
  2111.     "turn,twist,rotate,spin."
  2112.     "lift,raise."
  2113.     "lower"
  2114.     , verb)
  2115.     incase 0:
  2116.     p_oPlayChecker
  2117.     incase 1:
  2118.     p_oEraseChecker
  2119.     incase 2:
  2120.     p_oEatChecker
  2121.     incase 3:
  2122.     p_oUseChecker
  2123.     incase 4:
  2124.     p_oActivateChecker
  2125.     incase 5:
  2126.     p_oDeActivateChecker
  2127.     incase 6:
  2128.     p_oLightChecker
  2129.     incase 7:
  2130.     p_oExtinguishChecker
  2131.     incase 8:
  2132.     p_oWearChecker
  2133.     incase 9:
  2134.     p_oTouchChecker
  2135.     incase 10:
  2136.     p_oSmellChecker
  2137.     incase 11:
  2138.     p_oListenChecker
  2139.     incase 12:
  2140.     p_oOpenChecker
  2141.     incase 13:
  2142.     p_oCloseChecker
  2143.     incase 14:
  2144.     p_oPushChecker
  2145.     incase 15:
  2146.     p_oPullChecker
  2147.     incase 16:
  2148.     p_oTurnChecker
  2149.     incase 17:
  2150.     p_oLiftChecker
  2151.     incase 18:
  2152.     p_oLowerChecker
  2153.     default:
  2154.     nil
  2155.     esac
  2156. corp;
  2157.  
  2158. define tp_verbs proc v_play(string what)bool:
  2159.     VerbHere("play", p_oPlayString, p_oPlayChecker, p_pPlayChecker,
  2160.          "You cannot play", what)
  2161. corp;
  2162. define tp_verbs proc v_erase(string what)bool:
  2163.     VerbHere("erase", p_oEraseString, p_oEraseChecker, p_pEraseChecker,
  2164.          "You cannot erase", what)
  2165. corp;
  2166. /* want eat/drink to be VerbHere so can drink from streams, etc. */
  2167. define tp_verbs proc v_eat(string what)bool:
  2168.     VerbHere("eat", p_oEatString, p_oEatChecker, p_pEatChecker,
  2169.          "YECH! You cannot eat", what)
  2170. corp;
  2171. define tp_verbs proc v_drink(string what)bool:
  2172.     VerbHere("drink", p_oEatString, p_oEatChecker, p_pEatChecker,
  2173.          "YUCK! You cannot drink", what)
  2174. corp;
  2175. define tp_verbs proc v_use(string what)bool:
  2176.     VerbCarry("use", p_oUseString, p_oUseChecker, p_pUseChecker,
  2177.           "You cannot use", what)
  2178. corp;
  2179. define tp_verbs proc v_activate(string what)bool:
  2180.     VerbHere("activate", p_oActivateString, p_oActivateChecker,
  2181.          p_pActivateChecker, "You cannot activate", what)
  2182. corp;
  2183. define tp_verbs proc v_deactivate(string what)bool:
  2184.     VerbHere("deactivate", p_oDeActivateString, p_oDeActivateChecker,
  2185.          p_pDeActivateChecker, "You cannot deactivate", what)
  2186. corp;
  2187. define tp_verbs proc v_light(string what)bool:
  2188.     VerbHere("light", p_oLightString, p_oLightChecker, p_pLightChecker,
  2189.          "You cannot light", what)
  2190. corp;
  2191. define tp_verbs proc v_extinguish(string what)bool:
  2192.     VerbHere("extinguish", p_oExtinguishString, p_oExtinguishChecker,
  2193.          p_pExtinguishChecker, "You cannot extinguish", what)
  2194. corp;
  2195. define tp_verbs proc v_wear(string what)bool:
  2196.     VerbCarry("wear", p_oWearString, p_oWearChecker, p_pWearChecker,
  2197.           "You cannot wear", what)
  2198. corp;
  2199. define tp_verbs proc v_touch(string what)bool:
  2200.     VerbHere("touch", p_oTouchString, p_oTouchChecker, p_pTouchChecker,
  2201.          "You feel nothing special about", what)
  2202. corp;
  2203. define tp_verbs proc v_smell(string what)bool:
  2204.     VerbHere("smell", p_oSmellString, p_oSmellChecker, p_pSmellChecker,
  2205.          "You smell nothing special about", what)
  2206. corp;
  2207. define tp_verbs proc v_listen(string what)bool:
  2208.     VerbHere("listen to", p_oListenString, p_oListenChecker, p_pListenChecker,
  2209.          "You hear nothing special from", what)
  2210. corp;
  2211. define tp_verbs proc v_open(string what)bool:
  2212.     VerbHere("open", p_oOpenString, p_oOpenChecker, p_pOpenChecker,
  2213.          "You cannot open", what)
  2214. corp;
  2215. define tp_verbs proc v_close(string what)bool:
  2216.     VerbHere("close", p_oCloseString, p_oCloseChecker, p_pCloseChecker,
  2217.          "You cannot close", what)
  2218. corp;
  2219. define tp_verbs proc v_push(string what)bool:
  2220.     VerbHere("push", p_oPushString, p_oPushChecker, p_pPushChecker,
  2221.          "You cannot push", what)
  2222. corp;
  2223. define tp_verbs proc v_pull(string what)bool:
  2224.     VerbHere("pull", p_oPullString, p_oPullChecker, p_pPullChecker,
  2225.          "You cannot pull", what)
  2226. corp;
  2227. define tp_verbs proc v_turn(string what)bool:
  2228.     VerbHere("turn", p_oTurnString, p_oTurnChecker, p_pTurnChecker,
  2229.          "You cannot turn", what)
  2230. corp;
  2231. define tp_verbs proc v_lift(string what)bool:
  2232.     VerbHere("lift", p_oLiftString, p_oLiftChecker, p_pLiftChecker,
  2233.          "You cannot lift", what)
  2234. corp;
  2235. define tp_verbs proc v_lower(string what)bool:
  2236.     VerbHere("lower", p_oLowerString, p_oLowerChecker, p_pLowerChecker,
  2237.          "You cannot lower", what)
  2238. corp;
  2239.  
  2240. Verb1(G, "play", 0, v_play).
  2241. Verb1(G, "erase", 0, v_erase).
  2242. Verb1(G, "eat", 0, v_eat).
  2243. Synonym(G, "eat", "lick").
  2244. Synonym(G, "eat", "taste").
  2245. Verb1(G, "drink", 0, v_drink);
  2246. Synonym(G, "drink", "quaff").
  2247. Synonym(G, "drink", "imbibe").
  2248. Verb1(G, "use", 0, v_use).
  2249. Synonym(G, "use", "apply").
  2250. Verb1(G, "activate", 0, v_activate).
  2251. Verb1(G, "turn", FindAnyWord(G, "on"), v_activate).
  2252. Verb1(G, "deactivate", 0, v_deactivate).
  2253. Synonym(G, "deactivate", "inactivate").
  2254. Verb1(G, "turn", FindAnyWord(G, "off"), v_deactivate).
  2255. Verb1(G, "light", 0, v_light).
  2256. Synonym(G, "light", "ignite").
  2257. Verb1(G, "extinguish", 0, v_extinguish).
  2258. Synonym(G, "extinguish", "douse").
  2259. Verb1(G, "wear", 0, v_wear).
  2260. Verb1(G, "touch", 0, v_touch).
  2261. Synonym(G, "touch", "feel").
  2262. Synonym(G, "touch", "pet").
  2263. Verb1(G, "smell", 0, v_smell).
  2264. Synonym(G, "smell", "sniff").
  2265. Verb1(G, "listen", FindAnyWord(G, "to"), v_listen).
  2266. Verb1(G, "listen", FindAnyWord(G, "at"), v_listen).
  2267. Verb1(G, "open", 0, v_open).
  2268. Verb1(G, "close", 0, v_close).
  2269. Synonym(G, "close", "shut").
  2270. Verb1(G, "push", 0, v_push).
  2271. Synonym(G, "push", "shove").
  2272. Verb1(G, "pull", 0, v_pull).
  2273. Synonym(G, "pull", "yank").
  2274. Synonym(G, "pull", "jerk").
  2275. Synonym(G, "pull", "tug").
  2276. Verb1(G, "turn", 0, v_turn).
  2277. Synonym(G, "turn", "rotate").
  2278. Synonym(G, "turn", "twist").
  2279. Synonym(G, "turn", "spin").
  2280. Synonym(G, "turn", "crank").
  2281. Synonym(G, "turn", "wind").
  2282. Verb1(G, "lift", FindAnyWord(G, "up"), v_lift).
  2283. Synonym(G, "lift", "raise").
  2284. Verb1(G, "lower", 0, v_lower).
  2285.  
  2286. /* properties associated with specific commands ('register', 'buy') */
  2287.  
  2288. define t_base p_rRegisterAction CreateActionProp().
  2289. define t_base p_rHintAction CreateActionProp().
  2290. define t_base p_rHintString CreateStringProp().
  2291. define t_base p_rInfoAction CreateActionProp().
  2292. define t_base p_rInfoString CreateStringProp().
  2293.  
  2294. /* and other verbs that use actions attached to locations */
  2295.  
  2296. define tp_verbs proc v_register()bool:
  2297.     action a;
  2298.  
  2299.     a := Here()@p_rRegisterAction;
  2300.     if a = nil then
  2301.     Print("There is nothing to register at here.\n");
  2302.     false
  2303.     else
  2304.     call(a, bool)()
  2305.     fi
  2306. corp;
  2307.  
  2308. Verb0(G, "register", 0, v_register).
  2309. Synonym(G, "register", "reg").
  2310. Synonym(G, "register", "r").
  2311.  
  2312. define tp_verbs proc v_buy(string what)bool:
  2313.     action a;
  2314.  
  2315.     if what = "" then
  2316.     Print("You must specify what you want to buy.\n");
  2317.     false
  2318.     else
  2319.     a := Here()@p_rBuyAction;
  2320.     if a = nil then
  2321.         Print("There is nothing here to buy.\n");
  2322.         false
  2323.     else
  2324.         call(a, bool)(what)
  2325.     fi
  2326.     fi
  2327. corp;
  2328.  
  2329. Verb1(G, "buy", 0, v_buy).
  2330. Synonym(G, "buy", "purchase").
  2331.  
  2332. define tp_verbs proc v_hint(string what)bool:
  2333.     action a;
  2334.     string st;
  2335.  
  2336.     a := Here()@p_rHintAction;
  2337.     if a = nil then
  2338.     st := Here()@p_rHintString;
  2339.     if st = "" then
  2340.         Print("There are no hints here.\n");
  2341.         false
  2342.     else
  2343.         Print(st + "\n");
  2344.         true
  2345.     fi
  2346.     else
  2347.     call(a, bool)(what)
  2348.     fi
  2349. corp;
  2350.  
  2351. Verb1(G, "hint", 0, v_hint).
  2352.  
  2353. define tp_verbs proc v_info(string what)bool:
  2354.     action a;
  2355.     string st;
  2356.  
  2357.     a := Here()@p_rInfoAction;
  2358.     if a = nil then
  2359.     st := Here()@p_rInfoString;
  2360.     if st = "" then
  2361.         Print("There is no info to give here.\n");
  2362.         false
  2363.     else
  2364.         Print(st + "\n");
  2365.         true
  2366.     fi
  2367.     else
  2368.     call(a, bool)(what)
  2369.     fi
  2370. corp;
  2371.  
  2372. Verb1(G, "info", 0, v_hint).
  2373. Synonym(G, "info", "information").
  2374.  
  2375. /* some commands for folks to complain to SysAdmin */
  2376.  
  2377. define tp_verbs proc complain(string kind)bool:
  2378.  
  2379.     Log(kind + ": '" + Here()@p_rName + "' owner " +
  2380.     CharacterThing(Owner(Here()))@p_pName + ": " +
  2381.     GetTail() + "\n");
  2382.     Print(kind + " logged.\n");
  2383.     true
  2384. corp;
  2385.  
  2386. define tp_verbs proc v_typo()bool:
  2387.     complain("Typo")
  2388. corp;
  2389.  
  2390. define tp_verbs proc v_bug()bool:
  2391.     complain("Bug")
  2392. corp;
  2393.  
  2394. define tp_verbs proc v_gripe()bool:
  2395.     complain("Gripe")
  2396. corp;
  2397.  
  2398. VerbTail(G, "typo", v_typo).
  2399. VerbTail(G, "bug", v_bug).
  2400. VerbTail(G, "gripe", v_gripe).
  2401. Synonym(G, "gripe", "complain").
  2402. Synonym(G, "gripe", "bitch").
  2403.  
  2404. define tp_verbs proc v_cast()bool:
  2405.     string what;
  2406.     action a;
  2407.  
  2408.     what := GetWord();
  2409.     if what = "" then
  2410.     Print("You must specify the spell you want to run.\n");
  2411.     false
  2412.     else
  2413.     a := LookupAction(nil, what);
  2414.     if a = nil then
  2415.         Print("You know no spell by that name.\n");
  2416.         false
  2417.     else
  2418.         call(a, void)();
  2419.         true
  2420.     fi
  2421.     fi
  2422. corp;
  2423.  
  2424. VerbTail(G, "cast", v_cast).
  2425.  
  2426. define tp_verbs proc setTextColours(int colour0, colour1, colour2,colour3)bool:
  2427.     thing me;
  2428.  
  2429.     me := Me();
  2430.     me@p_pTextColours[0] := colour0;
  2431.     me@p_pTextColours[1] := colour1;
  2432.     me@p_pTextColours[2] := colour2;
  2433.     me@p_pTextColours[3] := colour3;
  2434.     GSetTextColour(nil, 0, colour0);
  2435.     GSetTextColour(nil, 1, colour1);
  2436.     GSetTextColour(nil, 2, colour2);
  2437.     GSetTextColour(nil, 3, colour3);
  2438.     true
  2439. corp;
  2440.  
  2441. define tp_verbs proc v_brightGold()bool:
  2442.     setTextColours(0x000, 0xda0, 0xb80, 0xfc0)
  2443. corp;
  2444.  
  2445. define tp_verbs proc v_normalGold()bool:
  2446.     setTextColours(0x000, 0xb80, 0xa60, 0xda0)
  2447. corp;
  2448.  
  2449. define tp_verbs proc v_dimGold()bool:
  2450.     setTextColours(0x000, 0xa60, 0x850, 0xb80)
  2451. corp;
  2452.  
  2453. define tp_verbs proc v_brightGrey()bool:
  2454.     setTextColours(0x000, 0xddd, 0xbbb, 0xeee)
  2455. corp;
  2456.  
  2457. define tp_verbs proc v_normalGrey()bool:
  2458.     setTextColours(0x000, 0xbbb, 0x999, 0xddd)
  2459. corp;
  2460.  
  2461. define tp_verbs proc v_dimGrey()bool:
  2462.     setTextColours(0x000, 0x999, 0x777, 0xbbb)
  2463. corp;
  2464.  
  2465. define tp_verbs proc v_blueGrey()bool:
  2466.     setTextColours(0xbbb, 0x06b, 0x03a, 0x000)
  2467. corp;
  2468.  
  2469. define tp_verbs proc v_reverseGrey()bool:
  2470.     setTextColours(0xddd, 0x999, 0x777, 0x000)
  2471. corp;
  2472.  
  2473. define tp_verbs proc v_textcolours()bool:
  2474.     int colour0, colour1, colour2, colour3;
  2475.     thing me;
  2476.  
  2477.     colour0 := StringToPosInt(GetWord());
  2478.     colour1 := StringToPosInt(GetWord());
  2479.     colour2 := StringToPosInt(GetWord());
  2480.     colour3 := StringToPosInt(GetWord());
  2481.     if colour0 < 0 or colour1 < 0 or colour2 < 0 or colour3 < 0 or
  2482.     GetWord() ~= ""
  2483.     then
  2484.     me := Me();
  2485.     Print("Use is: textcolours <colour> <colour> <colour> <colour>\n");
  2486.     Print("  <colour> values are for pens 0, 1, 2, and 3 respectively.\n");
  2487.     Print("  <colour> values must be positive decimal numbers.\n");
  2488.     Print("  Current values are: " +
  2489.         IntToString(me@p_pTextColours[0]) + " " +
  2490.         IntToString(me@p_pTextColours[1]) + " " +
  2491.         IntToString(me@p_pTextColours[2]) + " " +
  2492.         IntToString(me@p_pTextColours[3]) + "\n");
  2493.     false
  2494.     else
  2495.     setTextColours(colour0, colour1, colour2, colour3)
  2496.     fi
  2497. corp;
  2498.  
  2499. Verb0(G, "brightgold", 0, v_brightGold).
  2500. Verb0(G, "normalgold", 0, v_normalGold).
  2501. Verb0(G, "dimgold", 0, v_dimGold).
  2502. Verb0(G, "brightgrey", 0, v_brightGrey).
  2503. Verb0(G, "normalgrey", 0, v_normalGrey).
  2504. Verb0(G, "dimgrey", 0, v_dimGrey).
  2505. Verb0(G, "bluegrey", 0, v_blueGrey).
  2506. Verb0(G, "reversegrey", 0, v_reverseGrey).
  2507. VerbTail(G, "textcolours", v_textcolours).
  2508.  
  2509. define tp_verbs proc v_cursor(string colour)bool:
  2510.     int which;
  2511.  
  2512.     if colour = "" then
  2513.     Print("Use is: cursor <colour-name>\n");
  2514.     ShowKnownColours();
  2515.     false
  2516.     else
  2517.     which := ColourMatch(colour);
  2518.     if which = -1 then
  2519.         Print("Colour " + FormatName(colour) + " not known.\n");
  2520.         false
  2521.     else
  2522.         Me()@p_pCursorColour := which;
  2523.         SetCursorPen(which);
  2524.         true
  2525.     fi
  2526.     fi    
  2527. corp;
  2528.  
  2529. define tp_verbs proc v_icons(string colour)bool:
  2530.     int which;
  2531.  
  2532.     if colour = "" then
  2533.     Print("Use is: icons <colour-name>\n");
  2534.     ShowKnownColours();
  2535.     false
  2536.     else
  2537.     which := ColourMatch(colour);
  2538.     if which = -1 then
  2539.         Print("Colour " + FormatName(colour) + " not known.\n");
  2540.         false
  2541.     else
  2542.         Me()@p_pIconColour := which;
  2543.         GSetIconPen(nil, which);
  2544.         true
  2545.     fi
  2546.     fi
  2547. corp;
  2548.  
  2549. Verb1(G, "cursor", 0, v_cursor).
  2550. Verb1(G, "icon", 0, v_icons).
  2551. Synonym(G, "icon", "icons").
  2552.  
  2553. unuse tp_verbs
  2554.